package everyday;

import org.junit.jupiter.api.Test;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

/**
 * Map相关操作
 *
 * @author gaojie
 * @date 2023-07-04
 */
public class MapOperation {

    /**
     * 测试2种遍历集合的方式有啥区别
     * 结论：没有区别
     */
    @Test
    void test01() {
        Map<String, Object> map = new HashMap<>();
        map.put("A", 11);
        map.put("B", "22");
        map.put("C", null);
        System.out.println(map);
        System.out.println("----分割线----");
        for (Map.Entry<String, Object> e : map.entrySet()) {
            System.out.println(e.getKey() + "--" + e.getValue());
        }
        System.out.println("----分割线----");
        map.forEach((k, v) -> System.out.println(k + "==" + v));
    }

    /**
     * 测试 Map 的 computeIfAbsent
     * 结论：computeIfAbsent主要是判断方法的入参key
     * 1.如果存在：不会走进function，则直接返回(不改变map)
     * 2.如果不存在：会走进function，并返回指定值(改变map)
     */
    @Test
    void test02() {
        Map<String, Integer> map = new HashMap<>();
        map.put("A", 1);
        map.put("B", 2);
        map.put("C", 3);
        System.out.println(map);

        Integer c = map.computeIfAbsent("C", k -> {
            System.out.printf("[%s]走进了computeIfAbsent逻辑%n", k);
            return 1;
        });
        System.out.printf("返回值[c=%s]%n", c);
        Integer d = map.computeIfAbsent("D", k -> {
            System.out.printf("[%s]走进了computeIfAbsent逻辑%n", k);
            return 1;
        });
        System.out.printf("返回值[d=%s]%n", d);
        System.err.println(map);
    }

    /**
     * 测试 Map 的 computeIfPresent
     * 结论：computeIfPresent 主要是判断方法的入参key
     * 1.如果存在：会走进function，并返回指定值(改变map)
     * 2.如果不存在：不会走进function，直接返回null(不改变map)
     */
    @Test
    void test03() {
        Map<String, Integer> map = new HashMap<>();
        map.put("A", 1);
        map.put("B", 2);
        map.put("C", 3);
        System.out.println(map);

        Integer c = map.computeIfPresent("C", (k, v) -> {
            System.out.printf("[k=%s,v=%s]走进了computeIfPresent逻辑%n", k, v);
            return v + 4;
        });
        System.out.printf("返回值[c=%s]%n", c);

        Integer d = map.computeIfPresent("D", (k, v) -> {
            System.out.printf("[k=%s,v=%s]走进了computeIfPresent逻辑%n", k, v);
            return v + 4;
        });
        System.out.printf("返回值[d=%s]%n", d);
        System.err.println(map);
    }

    /**
     * 测试 Map 的 compute
     * 结论：compute 不会判断 key 是否存在，都会走进 function，都需要指定返回值，都会改变 map
     */
    @Test
    void test04() {
        Map<String, Integer> map = new HashMap<>();
        map.put("A", 1);
        map.put("B", 2);
        map.put("C", 3);
        System.out.println(map);

        Integer c = map.compute("C", (k, v) -> {
            System.out.printf("[k=%s,v=%s]走进了compute逻辑%n", k, v);
            return Objects.isNull(v) ? 0 : v + 4;
        });
        System.out.printf("返回值[c=%s]%n", c);

        Integer d = map.compute("D", (k, v) -> {
            System.out.printf("[k=%s,v=%s]走进了compute逻辑%n", k, v);
            return Objects.isNull(v) ? 0 : v + 4;
        });
        System.out.printf("返回值[d=%s]%n", d);
        System.err.println(map);
    }
}